package com.wh.basic.handle;

import com.wh.basic.jwt.JwtTokenUtils;
import com.wh.basic.jwt.LoginData;
import com.wh.basic.jwt.Payload;
import com.wh.basic.jwt.RsaUtils;
import com.wh.basic.vo.tokenVersion;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 登录拦截器
     * 在执行目标方法之前，先执行此方法
     */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //1.获取token中的
        String token = request.getHeader("token");
      

        // 2.如果token不为空
        if (token != null) {
            // 2.获取公钥
            PublicKey publicKey;
            try (InputStream inputStream = JwtTokenUtils.class.getClassLoader().getResourceAsStream("auth_rsa.pub")) {
                if (inputStream == null) {
                    throw new RuntimeException("找不到密钥文件：auth_rsa_pub.txt");
                }
                publicKey = RsaUtils.getPublicKey(inputStream);
            } catch (IOException e) {
                throw new RuntimeException("读取密钥失败：auth_rsa_pub.txt", e);
            }
            try {
                // 当前的系统定义时的版本号
               String version=tokenVersion.TokenVersion;
                // 3.使用工具类解密获取载荷PayLoad
                Payload<LoginData> payload = JwtTokenUtils.getInfoFromToken(version, token, publicKey, LoginData.class);
                // 5. 获取版本号
                String tokenversion = payload.getVersion();
                // 6. 检查版本号
                if (!version.equals(tokenversion)) {
                  //版本号不一致,说明已经失效了
                    response.setContentType("application/json;charset=UTF-8");
                    // 由于上面已经告诉了浏览器指定的类型。所以浏览器接收到这个数据之后就会自动转换成json对象
                    response.getWriter().println("{\"success\":false,\"msg\":\"noLogin\"}");
                    return false;
                }
                // 如果没有报错 => 登录了
                return true; // 没有刷新过期时间 - 没有做
            } catch (ExpiredJwtException e) {
                // 告诉浏览器：我给你响应一个json数据，并且使用UTF-8进行编码
                response.setContentType("application/json;charset=UTF-8");
                // 由于上面已经告诉了浏览器指定的类型。所以浏览器接收到这个数据之后就会自动转换成json对象
                response.getWriter().println("{\"success\":false,\"msg\":\"noLogin\"}");
                return false;
            } catch (MalformedJwtException e) {
                // Token不符合规范
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().println("{\"success\":false,\"msg\":\"Invalid JWT format\"}");
                return false;
            }
        }

        //3.判断 - 如果没有token/登录信息过期了(null) - 直接拦截 响应前端 - 跳转到登录页面
        response.setContentType("application/json;charset=utf8");
        response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
        return false;

    }}
